home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / email / quoprimime.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  5KB  |  208 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. __all__ = [
  5.     'body_decode',
  6.     'body_encode',
  7.     'body_quopri_check',
  8.     'body_quopri_len',
  9.     'decode',
  10.     'decodestring',
  11.     'encode',
  12.     'encodestring',
  13.     'header_decode',
  14.     'header_encode',
  15.     'header_quopri_check',
  16.     'header_quopri_len',
  17.     'quote',
  18.     'unquote']
  19. import re
  20. from string import hexdigits
  21. from email.utils import fix_eols
  22. CRLF = '\r\n'
  23. NL = '\n'
  24. MISC_LEN = 7
  25. hqre = re.compile('[^-a-zA-Z0-9!*+/ ]')
  26. bqre = re.compile('[^ !-<>-~\\t]')
  27.  
  28. def header_quopri_check(c):
  29.     return bool(hqre.match(c))
  30.  
  31.  
  32. def body_quopri_check(c):
  33.     return bool(bqre.match(c))
  34.  
  35.  
  36. def header_quopri_len(s):
  37.     count = 0
  38.     for c in s:
  39.         if hqre.match(c):
  40.             count += 3
  41.             continue
  42.         count += 1
  43.     
  44.     return count
  45.  
  46.  
  47. def body_quopri_len(str):
  48.     count = 0
  49.     for c in str:
  50.         if bqre.match(c):
  51.             count += 3
  52.             continue
  53.         count += 1
  54.     
  55.     return count
  56.  
  57.  
  58. def _max_append(L, s, maxlen, extra = ''):
  59.     if not L:
  60.         L.append(s.lstrip())
  61.     elif len(L[-1]) + len(s) <= maxlen:
  62.         L[-1] += extra + s
  63.     else:
  64.         L.append(s.lstrip())
  65.  
  66.  
  67. def unquote(s):
  68.     return chr(int(s[1:3], 16))
  69.  
  70.  
  71. def quote(c):
  72.     return '=%02X' % ord(c)
  73.  
  74.  
  75. def header_encode(header, charset = 'iso-8859-1', keep_eols = False, maxlinelen = 76, eol = NL):
  76.     if not header:
  77.         return header
  78.     
  79.     if not keep_eols:
  80.         header = fix_eols(header)
  81.     
  82.     quoted = []
  83.     if maxlinelen is None:
  84.         max_encoded = 100000
  85.     else:
  86.         max_encoded = maxlinelen - len(charset) - MISC_LEN - 1
  87.     for c in header:
  88.         if c == ' ':
  89.             _max_append(quoted, '_', max_encoded)
  90.             continue
  91.         if not hqre.match(c):
  92.             _max_append(quoted, c, max_encoded)
  93.             continue
  94.         _max_append(quoted, '=%02X' % ord(c), max_encoded)
  95.     
  96.     joiner = eol + ' '
  97.     return []([ '=?%s?q?%s?=' % (charset, line) for line in quoted ])
  98.  
  99.  
  100. def encode(body, binary = False, maxlinelen = 76, eol = NL):
  101.     if not body:
  102.         return body
  103.     
  104.     if not binary:
  105.         body = fix_eols(body)
  106.     
  107.     encoded_body = ''
  108.     lineno = -1
  109.     lines = body.splitlines(1)
  110.     for line in lines:
  111.         if line.endswith(CRLF):
  112.             line = line[:-2]
  113.         elif line[-1] in CRLF:
  114.             line = line[:-1]
  115.         
  116.         lineno += 1
  117.         encoded_line = ''
  118.         prev = None
  119.         linelen = len(line)
  120.         for j in range(linelen):
  121.             c = line[j]
  122.             prev = c
  123.             if bqre.match(c):
  124.                 c = quote(c)
  125.             elif j + 1 == linelen:
  126.                 if c not in ' \t':
  127.                     encoded_line += c
  128.                 
  129.                 prev = c
  130.                 continue
  131.             
  132.             if len(encoded_line) + len(c) >= maxlinelen:
  133.                 encoded_body += encoded_line + '=' + eol
  134.                 encoded_line = ''
  135.             
  136.             encoded_line += c
  137.         
  138.         if prev and prev in ' \t':
  139.             if lineno + 1 == len(lines):
  140.                 prev = quote(prev)
  141.                 if len(encoded_line) + len(prev) > maxlinelen:
  142.                     encoded_body += encoded_line + '=' + eol + prev
  143.                 else:
  144.                     encoded_body += encoded_line + prev
  145.             else:
  146.                 encoded_body += encoded_line + prev + '=' + eol
  147.             encoded_line = ''
  148.         
  149.         if lines[lineno].endswith(CRLF) or lines[lineno][-1] in CRLF:
  150.             encoded_body += encoded_line + eol
  151.         else:
  152.             encoded_body += encoded_line
  153.         encoded_line = ''
  154.     
  155.     return encoded_body
  156.  
  157. body_encode = encode
  158. encodestring = encode
  159.  
  160. def decode(encoded, eol = NL):
  161.     if not encoded:
  162.         return encoded
  163.     
  164.     decoded = ''
  165.     for line in encoded.splitlines():
  166.         line = line.rstrip()
  167.         if not line:
  168.             decoded += eol
  169.             continue
  170.         
  171.         i = 0
  172.         n = len(line)
  173.         while i < n:
  174.             c = line[i]
  175.             if c != '=':
  176.                 decoded += c
  177.                 i += 1
  178.             elif i + 1 == n:
  179.                 i += 1
  180.                 continue
  181.             elif i + 2 < n and line[i + 1] in hexdigits and line[i + 2] in hexdigits:
  182.                 decoded += unquote(line[i:i + 3])
  183.                 i += 3
  184.             else:
  185.                 decoded += c
  186.                 i += 1
  187.             if i == n:
  188.                 decoded += eol
  189.                 continue
  190.     
  191.     if not encoded.endswith(eol) and decoded.endswith(eol):
  192.         decoded = decoded[:-1]
  193.     
  194.     return decoded
  195.  
  196. body_decode = decode
  197. decodestring = decode
  198.  
  199. def _unquote_match(match):
  200.     s = match.group(0)
  201.     return unquote(s)
  202.  
  203.  
  204. def header_decode(s):
  205.     s = s.replace('_', ' ')
  206.     return re.sub('=\\w{2}', _unquote_match, s)
  207.  
  208.